package BL;

import DA.Conexion;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Usuario {

    private String nombre;
    private String usuario;
    private String pwd;
    private Date ultFecha;
    public Usuario(){}
    public Usuario(String nombre, String usuario, String pwd, Date ultFecha) {
        this.setNombre(nombre);
        this.setUsuario(usuario);
        this.setPwd(pwd);
        this.setUltFecha(ultFecha);
    }

    /**
     * *************************Gets y Sets*************************************
     */
    public String getNombre() {
        return nombre;
    }

    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    public String getUsuario() {
        return usuario;
    }

    public void setUsuario(String usuario) {
        this.usuario = usuario;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = this.encriptaEnMD5(pwd);
    }

    public Date getUltFecha() {
        return ultFecha;
    }

    public void setUltFecha(Date ultFecha) {
        this.ultFecha = ultFecha;
    }

    public boolean insertarUsuario() throws SQLException {
        Connection con = Conexion.getConexion();
        boolean result = false;
        if (con != null) {
            String sql = "{call InsertarUsuario(?,?,?)}";
            try {
                CallableStatement st = con.prepareCall(sql);
                st.setString(1, this.getNombre());
                st.setString(2, this.getUsuario());
                st.setString(3, this.getPwd());
                st.execute();
                result = true;
                con.close();
            } catch (SQLException ex) {
                throw ex;
            }
        }
        return result;
    }

    public boolean actualizarUsuario(String user,String nombre,String pwd) throws SQLException {
        boolean res=true;
        Connection co = Conexion.getConexion();
        if(co!=null){
            String proceso="{call ActualizarUsuario(?,?,?)}";
            CallableStatement llamada = co.prepareCall(proceso);
                llamada.setString(1, user);
                llamada.setString(2,nombre);
                llamada.setString(3,pwd);
                llamada.execute();
                co.close();
        }else{
            res=false;
        }
        return res;
    }
    
    public boolean realizarActualizacion(String userN,String Pwd) throws SQLException{
        boolean res=false;
        //si el nuevo nombre es igual y el pwd no contiene nada se retorna falso
        if(!getNombre().equals(userN)&&!Pwd.isEmpty()){
            setPwd(Pwd);
            res=actualizarUsuario(getUsuario(),userN,getPwd());
        }else{
            if(getNombre().equals(userN)&&!Pwd.isEmpty()){
                setPwd(Pwd);
                res=actualizarUsuario(getUsuario(),null,getPwd());
            }else{
                if(!getNombre().equals(userN)&&Pwd.isEmpty()){
                    res=actualizarUsuario(getUsuario(),userN,null);
                }
            }
        }
        return res;
    }
    
    private final static char[] CONSTS_HEX = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    private static String encriptaEnMD5(String stringAEncriptar) {
        try {
            MessageDigest msgd = MessageDigest.getInstance("MD5");
            byte[] bytes = msgd.digest(stringAEncriptar.getBytes());
            StringBuilder strbCadenaMD5 = new StringBuilder(2 * bytes.length);
            for (int i = 0; i < bytes.length; i++) {
                int bajo = (int) (bytes[i] & 0x0f);
                int alto = (int) ((bytes[i] & 0xf0) >> 4);
                strbCadenaMD5.append(CONSTS_HEX[alto]);
                strbCadenaMD5.append(CONSTS_HEX[bajo]);
            }
            return strbCadenaMD5.toString();
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }
    
    public static Usuario traerUsuario(String Usuario,String Contraseña) throws SQLException, ParseException{
        Usuario user = null;
        String encriptacion = encriptaEnMD5(Contraseña);
        Connection conex = Conexion.getConexion();
        if(conex!=null){
            CallableStatement st = conex.prepareCall("{CALL Login(?,?)}");
            st.setString(1, Usuario);
            st.setString(2,encriptacion);
            ResultSet resultado = st.executeQuery();
            if(resultado.first()){
                //String nombre, String usuario, String pwd, Date ultFecha
                String name = (String)resultado.getObject("NombreUsuario");
                String usuario = (String)resultado.getObject("Usuario");
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                Date ultFecha=null;
                if(resultado.getString("UltimaConexion")!=null){
                java.util.Date aDate = sdf.parse(resultado.getString("UltimaConexion"));
                ultFecha=new Date(aDate.getTime());
                }
                System.out.print(ultFecha);
                user = new Usuario(name,usuario,"",ultFecha);
                st = conex.prepareCall("{CALL ModificarFechaDeIngreso(?)}");
                st.setString(1, usuario);
                st.execute();
            }
            conex.close();
        }
        return user;
    }
}
